package com.hhz.stream.part1;

import com.hhz.lambda.part1.Employee;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

/**
 * Stream 的中间操作====映射
 * <p>
 * 多个中间操作可以链接起来形成一个流水线，除非流上发生终止操作，否则中间操作不会执行任何的处理！
 * 而在终止操作时一次性全部处理，称为“惰性求值”
 *
 * @Author Rem
 * @Date 2020-02-12
 */

public class TestStream3 {

    List<Employee> employees = Arrays.asList(
            new Employee("张三", 16, 3468.12),
            new Employee("李四", 42, 9485.32),
            new Employee("王五", 24, 8482.99),
            new Employee("赵六", 33, 6381.82),
            new Employee("田七", 36, 4448.45),
            new Employee("方八", 36, 7485.42)
    );


    //中间操作

    /**
     * 映射
     * map=======接受Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数，该函数会被应用到每个元素上，并将其映射成一个新的元素
     * flatMap===接收一个函数作为参数，将流中每个值都换成另一个流，然后把所有流连接成一个流
     */


    //map  对集合中每个元素进行操作
    @Test
    public void test() {
        List<String> list = Arrays.asList("aaa", "bbb", "ccc");
        Stream<String> stringStream = list.stream()
                .map(String::toUpperCase);
        stringStream.forEach(System.out::println);

        employees.stream()
                .map(Employee::getName)
                .forEach(System.out::println);
    }


    //flatMap
    //需求：将list中每个字符串拆分为单个字符,    然后将每个单个的字符重新组合成一个新的集合
    @Test
    public void test2() {
        List<String> list = Arrays.asList("ada", "beb", "cfc");

        Stream<Stream<Character>> characterStream = list.stream()
                .map(TestStream3::getCharacter);

        //打印===先遍历得到每个Stream<Character>  然后里面再遍历得到Character
        characterStream.forEach(
                s -> s.forEach(System.out::println)
        );
    }

    //直接简化操作就是flatMap  直接得到Stream<Character>   相当于list.add()方法和ist.addAll()
    @Test
    public void test3() {
        List<String> list = Arrays.asList("ada", "beb", "cfc");
        Stream<Character> stream = list.stream()
                .flatMap(TestStream3::getCharacter);

        stream.forEach(System.out::println);

    }


    //将字符串拆分
    public static Stream<Character> getCharacter(String str) {
        List<Character> characterList = new ArrayList<>();
        for (Character chr : str.toCharArray()) {
            characterList.add(chr);
        }
        return characterList.stream();
    }
}
